package d2_final_exam.d2_second_question;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 老师的方法
 * <p>
 * 数据:
 * 张全蛋儿  农家乐,野外拓展
 * 李二狗子  轰趴,野外拓展,健身房
 * 翠花     野外拓展，
 * 小帅     轰趴，健身房
 * 有容     农家乐
 */

public class Test {
    public static void main(String[] args) {
        //目标:实现选景点的题目
        //1、那数据到程序中来。用对象来进行封装,用Map集合封装也可以
        Map<String, List<String>> selects = new HashMap<>();
        //2、再定义一个List集合,用于存储景点
        List<String> data1 = new ArrayList<>();
        //3、使用collections进行倒数据进去
        Collections.addAll(data1, "农家乐", "野外拓展");
        ///4、将数据存到集合中去
        selects.put("张全蛋儿", data1);


        //5、重复上面的步骤,完成数据的存储
        //2、再定义一个List集合,用于存储景点
        List<String> data2 = new ArrayList<>();
        //3、使用collections进行倒数据进去
        Collections.addAll(data2, "轰趴", "野外拓展", "健身方法");
        ///4、将数据存到集合中去
        selects.put("李二狗子", data2);

        //2、再定义一个List集合,用于存储景点
        List<String> data3 = new ArrayList<>();
        //3、使用collections进行倒数据进去
        Collections.addAll(data3, "野外拓展");
        ///4、将数据存到集合中去
        selects.put("翠花", data3);

        //2、再定义一个List集合,用于存储景点
        List<String> data4 = new ArrayList<>();
        //3、使用collections进行倒数据进去
        Collections.addAll(data4, "轰趴", "健身房");
        ///4、将数据存到集合中去
        selects.put("小帅", data4);

        //2、再定义一个List集合,用于存储景点
        List<String> data5 = new ArrayList<>();
        //3、使用collections进行倒数据进去
        Collections.addAll(data5, "农家乐");
        ///4、将数据存到集合中去
        selects.put("有容", data5);


        //2、开始遍历集合,展示效果:
        System.out.println(selects);

        //4、定义一个集合,用于存储景点,与景点的选次
        Map<String, Integer> infos = new HashMap<>();
        //遍历遍历,-->就是获取到所有的数据,然后做其他操作-->不大打印而已
        selects.forEach((name, data) -> {
            for (String datum : data) {
                //看集合中是否已经存在这个键,如果存在,加1, 不存在就填1
                infos.put(datum, infos.containsKey(datum) ? infos.get(datum) + 1 : 1);
            }
        });


        //3、完成第一个需求 -> 请找出每个去处想去的人数是多少，并输出投票最多的去处是哪个。
        //1.使用stream()流做
        //2.先做保留,避免出现次数相同的最大值,而max只能拿一个
        System.out.println("选择数最多的去处是:");
        Map.Entry<String, Integer> entry = infos.entrySet().
                stream().max((e1, e2) -> e1.getValue() - e2.getValue()).get();
        //3.再次利用stream流排除出现同次的最大值
        List<String> names = infos.entrySet().stream().
                filter(e -> e.getValue().equals(entry.getValue())).map(e -> e.getKey()).collect(Collectors.toList());
        //4.输出结果,进行展示
        System.out.println(names);

        //4、完成第二个需求 -> 请找出哪些人没有选择投票最多的去处, 输出他们的名字
        System.out.println(
                "没有选择最多选次的去处的人"
        );
        selects.entrySet().stream().filter(e -> {
            //1.遍历每个人所选择的景点名称
            for (String s : e.getValue()) {
                //2.判断景点是否在names里面被包含
                if (names.contains(s)){
                    //3.这些人就过滤掉
                    return false;
                }
            }
            return true;
            //4.然后进行加工, 只需要用到键
        }).forEach(e -> System.out.println(e.getKey()));


    }
}
